import axios from 'axios'
import router from '../router/index'
import { Message } from 'view-ui-plus'
import errorCodeMsg from './requestCode'
/*
    创建axios实例
*/
const baseURL =
  import.meta.env.VITE_REQUESTURL === '/test'
    ? import.meta.env.VITE_REQUESTURL
    : window.location.origin
const http = axios.create({
  baseURL,
  timeout: 600000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
})

// request拦截器
http.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('uk.token')
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false

    if (token && !isToken) {
      config.headers.Authorization = token // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config
  },
  (error) => {
    console.log(error)
    Promise.reject(error)
  }
)

/**
 * 请求拦截
 */
http.interceptors.response.use(
  (response) => {
    const { status } = response.data

    if(status === 'AUTH_ERROR') {
      Message.error('登录超时,请重新登录!')
      router.replace('/login')
      return Promise.reject(response.data)
    }

    if (status !== 'OK' && !(response.data instanceof Blob)) {
      Message.error(errorCodeMsg[status] || '')
      return Promise.reject(response.data)
    }

    return response
  },
  (error) => {
    if (error.code === 'ERR_NETWORK') {
      localStorage.removeItem('uk.token')
      Message.error('未知错误,请联系管理员')
      router.replace('/login')
      return
    }

    Message.error('请求失败，请稍后重试')

    if (error.code == 'ECONNABORTED') {
      return Promise.reject({ Msg: '请求超时' })
    } else if (error.response && error.response.data) {
      // 如果有响应数据，使用响应数据中的错误信息
      return Promise.reject({ Msg: error.response.data.message || error.message })
    } else {
      // 否则使用默认错误信息
      return Promise.reject({ Msg: error.message || '请求失败，请稍后重试' })
    }
  }
)

/** get请求
 * @param {
 *  url: string, // 请求地址
 *  params: object // 请求参数
 * }
 */
export function myGet(url, params = {}) {
  return http.get(url, { params: params }).then((response) => {
    return response.data
  })
}

/** post请求
 * @param {
 *  url: string, // 请求地址
 *  params: object // 请求参数
 * }
 */
export function myPost(url, params = {}) {
  return http.post(url, params).then((response) => {
    return response.data
  })
}

/** formData请求
 * @param {
 *  url: string, // 请求地址
 *  params: object // 请求参数
 * }
 */
export function formPost(url, params = {}) {
  let newForm = new FormData()
  Object.keys(params).forEach((key) => {
    const value = params[key]
    if (Array.isArray(value)) {
      // 如果是数组，则逐个添加每个元素
      value.forEach((item) => {
        newForm.append(`${key}[]`, item)
      })
    } else {
      // 否则直接添加
      newForm.append(key, value)
    }
  })
  return new Promise((resolve) => {
    http
      .post(url, newForm, {
        headers: {
          'content-type': 'multipart/form-data'
        }
      })
      .then(function (response) {
        resolve(response.data)
      })
  })
}

/** 文件下载请求
 * @param {
 *  url: string, // 请求地址
 *  params: object // 请求参数
 * }
 */
export function downloadfile(url, params) {
  return http.get(url, { params: params, responseType: 'blob' }).then((response) => {
    return response.data
  })
}

export default http
